(if (eq (nth 2 plist) prop)
(setcdr (cdr plist) (nthcdr 4 plist)))
(setq plist (cdr (cdr plist))))))
+
+(defun map-keymap (function keymap)
+ "Call FUNCTION for every binding in KEYMAP.
+This includes bindings inherited from a parent keymap.
+FUNCTION receives two arguments each time it is called:
+the character (more generally, the event type) that is bound,
+and the binding it has."
+ (while (consp keymap)
+ (if (consp (car keymap))
+ (funcall function (car (car keymap)) (cdr (car keymap)))
+ (if (vectorp (car keymap))
+ (let ((i (length (car keymap)))
+ (vector (car keymap)))
+ (while (>= i 0)
+ (funcall function i (aref vector i))
+ (setq i (1- i))))))
+ (setq keymap (cdr keymap))))